#include "NewClient.h"
#include "ui_NewClient.h"

extern QSqlDatabase enjoylifedb;
extern ClientSqlTableModel *client_model;
extern QTableView *client_view;
extern QSqlRelationalTableModel *persona_model;

namespace Ui {
class NewClient;
}

NewClient::NewClient(QWidget *parent) :
    QWidget(parent),
    m_model(new QSqlRelationalTableModel(this)),
    ui(new Ui::NewClient)
{
    ui->setupUi(this);

    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);

    m_model->setTable("cliente");

    ui->razon_social->setFocus();

    ui->open_btn->setToolTip("Carga una imagen desde el ordenador.");
    ui->cleanImg_btn->setToolTip("Borra la imagen cargada.");

    QDate date;
    ui->fecha_alta->setDate(date.currentDate());

    connect(ui->open_btn,SIGNAL(clicked()),this,SLOT(OpenImgFile()));
    connect(ui->cleanImg_btn,SIGNAL(clicked()),this,SLOT(ResetIMG()));
    connect(ui->cancel_btn,SIGNAL(clicked()),this,SLOT(CancelButton()));
    connect(ui->save_btn,SIGNAL(clicked()),this,SLOT(SaveButton()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(SaveButton()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

NewClient::~NewClient()
{
    enjoylifedb.transaction();
    if (!(client_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    delete ui;
}

void NewClient::OpenImgFile()
{
    QString img_file = QFileDialog::getOpenFileName(this,"Abrir archivo de imagen",QDir::currentPath());

    if (! img_file.isEmpty()) {
        QImage image(img_file);
        if (image.isNull()) {
            QMessageBox::critical(this,"Error al abrir",
                                  "No se puede leer el archivo seleccionado");
            return;
        }
        ui->logo_cliente->setPixmap(QPixmap::fromImage(image));
    }
}

void NewClient::CancelButton()
{
    enjoylifedb.transaction();
    if (!(client_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    hide();
    close();
}

void NewClient::SaveButton()
{
    QSqlRecord record;

    if (ui->razon_social->text().isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Razón Social no puede ser vacío");
        return;
    } else {
        QSqlField rsField(QStringLiteral("razon_social"), QVariant::String);
        rsField.setValue(ui->razon_social->text());
        record.append(rsField);
    }

    if (ui->responsable->text().isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Responsable no puede ser vacío");
        return;
    } else {
        QSqlField respField(QStringLiteral("responsable"), QVariant::String);
        respField.setValue(ui->responsable->text());
        record.append(respField);
    }

    QSqlField logoField(QStringLiteral("logo_cliente"), QVariant::ByteArray);
    QByteArray baPhoto;
    QBuffer buffer( &baPhoto );
    buffer.open( QBuffer::WriteOnly );
    if (ui->logo_cliente->pixmap()->save(&buffer, "png")) {
        logoField.setValue(baPhoto.toBase64());
        record.append(logoField);
    } else {
        QMessageBox::critical(this,"ERROR!", tr("No se pudo insertar la imagen. '%1'"
                             "intente de nuevo.").arg(buffer.errorString()));
        return;
    }

    if (ui->fecha_alta->text().isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Fecha de Alta no puede ser vacío");
        return;
    } else {
        QSqlField faField(QStringLiteral("fecha_alta"), QVariant::Date);
        faField.setValue(ui->fecha_alta->text());
        record.append(faField);
    }

    if (ui->calle->text().isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Calle no puede ser vacío");
        return;
    } else {
        QSqlField calleField(QStringLiteral("calle"), QVariant::String);
        calleField.setValue(ui->calle->text());
        record.append(calleField);
    }

    if (ui->numero->text().isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Número no puede ser vacío");
        return;
    } else {
        QSqlField numField(QStringLiteral("numero"), QVariant::Int);
        numField.setValue(ui->numero->text().toInt());
        record.append(numField);
    }

    QSqlField pisoField(QStringLiteral("piso"), QVariant::Int);
    pisoField.setValue(ui->piso->text().toInt());
    record.append(pisoField);

    QSqlField dptoField(QStringLiteral("dpto"), QVariant::String);
    dptoField.setValue(ui->dpto->text());
    record.append(dptoField);

    QSqlField barrioField(QStringLiteral("barrio"), QVariant::String);
    barrioField.setValue(ui->barrio->text());
    record.append(barrioField);

    if (ui->ciudad->text().isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Ciudad no puede ser vacío");
        return;
    } else {
        QSqlField ciudField(QStringLiteral("ciudad"), QVariant::String);
        ciudField.setValue(ui->ciudad->text());
        record.append(ciudField);
    }

    if (ui->provincia->text().isEmpty()) {
        QMessageBox::warning(this,"Advertencia!", "El campo Provincia no puede ser vacío");
        return;
    } else {
        QSqlField provField(QStringLiteral("provincia"), QVariant::String);
        provField.setValue(ui->provincia->text());
        record.append(provField);
    }

    QString tipo_tel1 = " ";
    if (ui->fijo1->isChecked()) {
        tipo_tel1 = "Fijo";
    }
    if (ui->movil1->isChecked()) {
        tipo_tel1 = "Movil";
    }
    QSqlField tipoTel1Field(QStringLiteral("tipo_tel_1"), QVariant::String);
    tipoTel1Field.setValue(tipo_tel1);
    record.append(tipoTel1Field);

    QSqlField tel1Field(QStringLiteral("telefono_1"), QVariant::String);
    tel1Field.setValue(ui->telefono_1->text());
    record.append(tel1Field);

    QString tipo_tel2 = " ";
    if (ui->fijo2->isChecked()) {
        tipo_tel2 = "Fijo";
    }
    if (ui->movil2->isChecked()) {
        tipo_tel2 = "Movil";
    }
    QSqlField tipoTel2Field(QStringLiteral("tipo_tel_2"), QVariant::String);
    tipoTel2Field.setValue(tipo_tel2);
    record.append(tipoTel2Field);

    QSqlField tel2Field(QStringLiteral("telefono_2"), QVariant::String);
    tel2Field.setValue(ui->telefono_2->text());
    record.append(tel2Field);

    QSqlField email1Field(QStringLiteral("email_1"), QVariant::String);
    email1Field.setValue(ui->email_1->text());
    record.append(email1Field);

    QSqlField email2Field(QStringLiteral("email_2"), QVariant::String);
    email2Field.setValue(ui->email_2->text());
    record.append(email2Field);

    QSqlField cuitField(QStringLiteral("cuit_cuil"), QVariant::String);
    cuitField.setValue(ui->cuit_cuil->text());
    record.append(cuitField);

    if (!(ui->comboBox_iva->currentIndex() == 0)) {
        QSqlField ivaField(QStringLiteral("iva"), QVariant::String);
        ivaField.setValue(ui->comboBox_iva->currentText());
        record.append(ivaField);
    }

//    QSqlField usCpanelField(QStringLiteral("usuario_cpanel"), QVariant::String);
//    usCpanelField.setValue(ui->usuario_cpanel->text());
//    record.append(usCpanelField);

//    QSqlField passCpanelField(QStringLiteral("contrasenia_cpanel"), QVariant::String);
//    passCpanelField.setValue(ui->contrasenia_cpanel->text());
//    record.append(passCpanelField);

//    QSqlField regNicField(QStringLiteral("registrante_nic"), QVariant::String);
//    regNicField.setValue(ui->registrante_nic->text());
//    record.append(regNicField);

//    QSqlField eRegNicField(QStringLiteral("email_registrante_nic"), QVariant::String);
//    eRegNicField.setValue(ui->email_registrante_nic->text());
//    record.append(eRegNicField);

    enjoylifedb.transaction();
    if (!(m_model->insertRecord(-1, record))) {
        QString error = m_model->lastError().text();
        QMessageBox::critical(this,"Error!", tr("No se pudo insertar el cliente, intentelo de nuevo."
                                                "\n %1").arg(error));
        enjoylifedb.rollback();
        return;
    }
    // Se agrega el cliente como una persona.
    enjoylifedb.transaction();
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "insert into persona (persona) values ('" + ui->razon_social->text() + "')";
    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudo insertar al cliente como una persona, "
                              "intentelo nuevamente || " + query->lastError().text());
        enjoylifedb.rollback();
        return;
    }

    QMessageBox::information(this,"Exito!", tr("Registro Exitoso!"));
    enjoylifedb.commit();
    enjoylifedb.commit();

    UpdateClientList();
    CorrectViewOfModel();
    CleanUi();
}

/*
 *
 */
void NewClient::CleanUi()
{
    ui->razon_social->clear();
    QDate date;
    ui->fecha_alta->setDate(date.currentDate());
    ui->logo_cliente->setPixmap(QPixmap("://Icons/UserImage02.png"));
    ui->responsable->clear();
    ui->calle->clear();
    ui->numero->clear();
    ui->dpto->clear();
    ui->barrio->clear();
    ui->ciudad->clear();
    ui->provincia->clear();
    ui->telefono_1->clear();
    ui->telefono_2->clear();
    ui->email_1->clear();
    ui->email_2->clear();
}

/**
 * @brief NewClient::ResetIMG
 */
void NewClient::ResetIMG()
{
    ui->logo_cliente->setPixmap(QPixmap("://Icons/UserImage02.png"));
}

/*
 * Lanzamiento de la acción de actualizar la lista de clientes manualmente.
 */
void NewClient::UpdateClientList()
{
    QString filtro = "estado is null";
    client_model->setTable("cliente");
    client_model->setFilter(filtro);
    enjoylifedb.transaction();
    if (!(client_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModel();
}

/*
 *  Organiza de manera adecuada la vista del modulo cliente
 */
void NewClient::CorrectViewOfModel()
{
    client_model->setHeaderData(0, Qt::Horizontal, "Nro. Cliente");
    client_model->setHeaderData(1, Qt::Horizontal, "Razón Social");
    client_model->setHeaderData(2, Qt::Horizontal, "Responsable");
    client_model->setHeaderData(4, Qt::Horizontal, "Fecha Alta");
//    client_model->setHeaderData(5, Qt::Horizontal, "Calle");
//    client_model->setHeaderData(6, Qt::Horizontal, "Nro.");
//    client_model->setHeaderData(7, Qt::Horizontal, "Piso");
//    client_model->setHeaderData(8, Qt::Horizontal, "Depto.");
//    client_model->setHeaderData(9, Qt::Horizontal, "Barrio");
//    client_model->setHeaderData(10, Qt::Horizontal, "Ciudad");
//    client_model->setHeaderData(11, Qt::Horizontal, "Provincia");
    client_model->setHeaderData(12, Qt::Horizontal, "Tipo Tel.");
    client_model->setHeaderData(13, Qt::Horizontal, "Telefono");
    client_model->setHeaderData(14, Qt::Horizontal, "Tipo Tel.");
    client_model->setHeaderData(15, Qt::Horizontal, "Tel. Altern.");
    client_model->setHeaderData(16, Qt::Horizontal, "E-mail");
    client_model->setHeaderData(17, Qt::Horizontal, "E-mail Altern.");
//    client_model->setHeaderData(18, Qt::Horizontal, "Usuario cpanel");
//    client_model->setHeaderData(19, Qt::Horizontal, "Pass cpanel");
//    client_model->setHeaderData(20, Qt::Horizontal, "Registrante NIC");
//    client_model->setHeaderData(21, Qt::Horizontal, "E-mail Regist. NIC");
//    client_model->setHeaderData(22, Qt::Horizontal, "Fecha Alta NIC");
//    client_model->setHeaderData(23, Qt::Horizontal, "Fecha Vto. NIC");

    // Vista del modelo definido anteriormente
    client_view->setModel(client_model);
    client_view->sortByColumn(0, Qt::SortOrder());
    client_view->setSortingEnabled(true);
    client_view->setAlternatingRowColors(true);
    client_view->setGridStyle(Qt::SolidLine);
    client_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    client_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    client_view->hideColumn(3);
    client_view->hideColumn(5);
    client_view->hideColumn(6);
    client_view->hideColumn(7);
    client_view->hideColumn(8);
    client_view->hideColumn(9);
    client_view->hideColumn(10);
    client_view->hideColumn(11);
//    client_view->hideColumn(18);
//    client_view->hideColumn(19);
//    client_view->hideColumn(20);
//    client_view->hideColumn(21);
//    client_view->hideColumn(22);
//    client_view->hideColumn(23);
}
